[Swift 3.0] Swift3.0で、NSNotificationCenterはNotificationCenterになった
1 はじめに
NSNotificationCenterは、アプリ内でオブジェクトに通知を送る仕組みとして、非常に多くの場面で利用されていると思います。 そして、このNSNotificationCenterも Swift 3.0で大きく変更が加えられました。
Xcodeの自動的な変換だけだと、addObserver(_:selector:name:object:)のselectorの指定あたりで限界があり、ちょっと戸惑ったので、自分用の覚書として纏めました。
2 インスタンス
デフォルトのNotification Centerの取得ですが、NSが無くなったと同時に、けっこうシンプルになってます。
Swift 2.3
let nc = NSNotificationCenter.defaultCenter()
Swift 3.0
let nc = NotificationCenter.default
3 登録
selectorと、NotificationNameの大きく変化しており、ここが一番戸惑うところです。
Swift 2.3
.addObserver(self, selector: #selector(ViewController.update(_:)), name: "MyNotification", object: nil)
Swift3.0
.addObserver(self, selector: #selector(self.update), name: Notification.Name(rawValue:"MyNotification"), object: nil)
4 送信
Swift APIのガイドラインに従って、関数名が短くなっています。 第1パラメータのNotificationを指定するところですが、Swift 2.3では、Stringが使用できましたが、Swift 3.0では、それが無くなっているため、ここもちょっと戸惑いポイントだと思います。
Swift2.3
.postNotificationName("MyNotification", object: nil)
Swift3.0
.post(name: Notification.Name(rawValue:"MyNotification"), object: nil)
5 受信
一応、Notificationを受け取るようにしました。
Swift 2.3
func update(notification: NSNotification?) { print("Notificaton") }
Swift 3.0
func update(notification: Notification?) { print("notification") }
6 削除
変わっていません。
Swift 2.3 / Swift 3.0
.removeObserver(self)
7 ブロック形式
最後に、ブロック形式で使用する場合の例です。パターンは同じです。
var observer:AnyObject?
Swift 2.3
let nc = NSNotificationCenter.defaultCenter() observer = nc.addObserverForName("MyNotification", object: nil, queue: nil, usingBlock: {( notification ) -> Void in print("Notification") })
if (observer != nil) { NSNotificationCenter.defaultCenter().removeObserver(observer!) }
Swift 3.0
let nc = NotificationCenter.default observer = nc.addObserver(forName: NSNotification.Name(rawValue: "MyNotification"), object: nil, queue: nil, using: {( notification ) -> Void in print("Notification") })
if (observer != nil) { NotificationCenter.default.removeObserver(observer!) }
8 最後に
NotificationCenterは、自動変換も限界があるので、しばらくこの覚書を頼りすると思います。(自分が、です。)
9 参考資料
API Reference NotificationCenter
API Reference NSNotificationCenter